--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / tests / e2e / messages-conversation-scroll.spec.js
Displaying Raw • Download
tests/e2e/messages-conversation-scroll.spec.js 5fa79d363bcbbb6c8fa7d6f26ee429eaa099a7ab (5fa79d36) Text, 10.28 KB
Tff7b72const Tb4b4b4{ Te6edf3testTb4b4b4, Te6edf3expect Tb4b4b4} Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"@playwright/test"Tb4b4b4)Tb4b4b4;
Tff7b72const Tb4b4b4{
Te6edf3prepareE2eSessionTb4b4b4,
Te6edf3seedE2eLongConversationThreadTb4b4b4,
Te6edf3seedE2eAltShortConversationThreadTb4b4b4,
Te6edf3getE2eLocalLxmfHashTb4b4b4,
Te6edf3E2E_SCROLL_PEER_HASHTb4b4b4,
Tb4b4b4} Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"./helpers"Tb4b4b4)Tb4b4b4;
Tff7b72async Tff7b72function Te6edf3waitForMessagesViewportReadyTb4b4b4(Te6edf3pageTb4b4b4) Tb4b4b4{
Tff7b72await Te6edf3pageTb4b4b4.Te6edf3waitForFunctionTb4b4b4(
Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3el Tff7b72= Tffa657documentTb4b4b4.Te6edf3getElementByIdTb4b4b4(Ta5d6ff"messages"Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3el Tff7b72!= Tff7b72null Tff7b72&& Te6edf3elTb4b4b4.Te6edf3getAttributeTb4b4b4(Ta5d6ff"aria-busy"Tb4b4b4) Tff7b72!== Ta5d6ff"true"Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72nullTb4b4b4,
Tb4b4b4{ Te6edf3timeoutTff7b72: T79c0ff30000 Tb4b4b4}
Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72async Tff7b72function Te6edf3scrollMetricsTb4b4b4(Te6edf3pageTb4b4b4) Tb4b4b4{
Tff7b72await Te6edf3waitForMessagesViewportReadyTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3loc Tff7b72= Te6edf3pageTb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff"#messages"Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3locTb4b4b4.Te6edf3evaluateTb4b4b4(Tb4b4b4(Te6edf3elTb4b4b4) Tb4b4b4=> Tb4b4b4(Tb4b4b4{
Te6edf3scrollTopTff7b72: Te6edf3elTb4b4b4.Te6edf3scrollTopTb4b4b4,
Te6edf3scrollHeightTff7b72: Te6edf3elTb4b4b4.Te6edf3scrollHeightTb4b4b4,
Te6edf3clientHeightTff7b72: Te6edf3elTb4b4b4.Te6edf3clientHeightTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72async Tff7b72function Te6edf3setMessagesToBottomTb4b4b4(Te6edf3pageTb4b4b4) Tb4b4b4{
Tff7b72await Te6edf3pageTb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff"#messages"Tb4b4b4)Tb4b4b4.Te6edf3evaluateTb4b4b4(Tb4b4b4(Te6edf3elTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3inner Tff7b72= Te6edf3elTb4b4b4.Te6edf3firstElementChildTb4b4b4;
Tff7b72const Te6edf3reverse Tff7b72= Te6edf3inner Tff7b72&& Te6edf3getComputedStyleTb4b4b4(Te6edf3innerTb4b4b4)Tb4b4b4.Te6edf3flexDirection Tff7b72=== Ta5d6ff"column-reverse"Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3reverseTb4b4b4) Tb4b4b4{
Te6edf3elTb4b4b4.Te6edf3scrollTop Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3elTb4b4b4.Te6edf3scrollTop Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3elTb4b4b4.Te6edf3scrollHeight Tff7b72- Te6edf3elTb4b4b4.Te6edf3clientHeightTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72async Tff7b72function Te6edf3messagesDistanceFromBottomTb4b4b4(Te6edf3pageTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3pageTb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff"#messages"Tb4b4b4)Tb4b4b4.Te6edf3evaluateTb4b4b4(Tb4b4b4(Te6edf3elTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3inner Tff7b72= Te6edf3elTb4b4b4.Te6edf3firstElementChildTb4b4b4;
Tff7b72const Te6edf3reverse Tff7b72= Te6edf3inner Tff7b72&& Te6edf3getComputedStyleTb4b4b4(Te6edf3innerTb4b4b4)Tb4b4b4.Te6edf3flexDirection Tff7b72=== Ta5d6ff"column-reverse"Tb4b4b4;
Tff7b72const Te6edf3max Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3elTb4b4b4.Te6edf3scrollHeight Tff7b72- Te6edf3elTb4b4b4.Te6edf3clientHeightTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3reverseTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3elTb4b4b4.Te6edf3scrollTopTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3max Tff7b72- Te6edf3elTb4b4b4.Te6edf3scrollTopTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72async Tff7b72function Te6edf3messagesNearBottomTb4b4b4(Te6edf3pageTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3pageTb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff"#messages"Tb4b4b4)Tb4b4b4.Te6edf3evaluateTb4b4b4(Tb4b4b4(Te6edf3elTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3inner Tff7b72= Te6edf3elTb4b4b4.Te6edf3firstElementChildTb4b4b4;
Tff7b72const Te6edf3reverse Tff7b72= Te6edf3inner Tff7b72&& Te6edf3getComputedStyleTb4b4b4(Te6edf3innerTb4b4b4)Tb4b4b4.Te6edf3flexDirection Tff7b72=== Ta5d6ff"column-reverse"Tb4b4b4;
Tff7b72const Te6edf3max Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3elTb4b4b4.Te6edf3scrollHeight Tff7b72- Te6edf3elTb4b4b4.Te6edf3clientHeightTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3eps Tff7b72= T79c0ff12Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3reverseTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3elTb4b4b4.Te6edf3scrollTop Tff7b72<= Te6edf3epsTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3max Tff7b72- Te6edf3elTb4b4b4.Te6edf3scrollTop Tff7b72<= Te6edf3epsTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72async Tff7b72function Te6edf3waitForMessagesOverflowTb4b4b4(Te6edf3pageTb4b4b4) Tb4b4b4{
Tff7b72await Te6edf3pageTb4b4b4.Te6edf3waitForFunctionTb4b4b4(
Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3el Tff7b72= Tffa657documentTb4b4b4.Te6edf3getElementByIdTb4b4b4(Ta5d6ff"messages"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3elTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3elTb4b4b4.Te6edf3scrollHeight Tff7b72> Te6edf3elTb4b4b4.Te6edf3clientHeight Tff7b72+ T79c0ff100Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72nullTb4b4b4,
Tb4b4b4{ Te6edf3timeoutTff7b72: T79c0ff30000 Tb4b4b4}
Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3testTb4b4b4.Te6edf3describeTb4b4b4(Ta5d6ff"Messages conversation scroll"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3testTb4b4b4.Te6edf3useTb4b4b4(Tb4b4b4{ Te6edf3viewportTff7b72: Tb4b4b4{ Te6edf3widthTff7b72: T79c0ff1280Tb4b4b4, Te6edf3heightTff7b72: T79c0ff360 Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3testTb4b4b4.Te6edf3beforeAllTb4b4b4(Tff7b72async Tb4b4b4(Tb4b4b4{ Te6edf3request Tb4b4b4}Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72await Te6edf3prepareE2eSessionTb4b4b4(Te6edf3requestTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3seedE2eLongConversationThreadTb4b4b4(Te6edf3requestTb4b4b4, Tb4b4b4{ Te6edf3messageCountTff7b72: T79c0ff120 Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3seedE2eAltShortConversationThreadTb4b4b4(Te6edf3requestTb4b4b4, Tb4b4b4{ Te6edf3messageCountTff7b72: T79c0ff12 Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3testTb4b4b4.Te6edf3beforeEachTb4b4b4(Tff7b72async Tb4b4b4(Tb4b4b4{ Te6edf3request Tb4b4b4}Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72await Te6edf3prepareE2eSessionTb4b4b4(Te6edf3requestTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3testTb4b4b4(Ta5d6ff"starts near bottom with a long thread"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4{ Te6edf3page Tb4b4b4}Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72await Te6edf3pageTb4b4b4.Tff7b72gotoTb4b4b4(Ta5d6ff"/#/messages"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3expectTb4b4b4(Te6edf3pageTb4b4b4.Te6edf3getByTextTb4b4b4(Ta5d6ff"Conversations"Tb4b4b4, Tb4b4b4{ Te6edf3exactTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4)Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeVisibleTb4b4b4(Tb4b4b4{ Te6edf3timeoutTff7b72: T79c0ff25000 Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3page
Tb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff".conversation-item"Tb4b4b4)
Tb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4{ Te6edf3hasTextTff7b72: Ta5d6ff/E2E scroll seed/ Tb4b4b4}Tb4b4b4)
Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3clickTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3waitForMessagesViewportReadyTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3expectTb4b4b4(Te6edf3pageTb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff"#messages"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeVisibleTb4b4b4(Tb4b4b4{ Te6edf3timeoutTff7b72: T79c0ff25000 Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3expectTb4b4b4(
Te6edf3page
Tb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff"#messages"Tb4b4b4)
Tb4b4b4.Te6edf3getByTextTb4b4b4(Ta5d6ff/E2E scroll seed 119/Tb4b4b4)
Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tb4b4b4)Tb4b4b4.Te6edf3toBeVisibleTb4b4b4(Tb4b4b4{
Te6edf3timeoutTff7b72: T79c0ff25000Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3waitForMessagesOverflowTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3m Tff7b72= Tff7b72await Te6edf3scrollMetricsTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3mTb4b4b4.Te6edf3scrollHeightTb4b4b4)Tb4b4b4.Te6edf3toBeGreaterThanTb4b4b4(Te6edf3mTb4b4b4.Te6edf3clientHeight Tff7b72+ T79c0ff80Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72await Te6edf3messagesNearBottomTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3testTb4b4b4(Ta5d6ff"does not jump to bottom when scrolled up and inbound arrives"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4{ Te6edf3pageTb4b4b4, Te6edf3request Tb4b4b4}Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3localHash Tff7b72= Tff7b72await Te6edf3getE2eLocalLxmfHashTb4b4b4(Te6edf3requestTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3pageTb4b4b4.Tff7b72gotoTb4b4b4(Ta5d6ff"/#/messages"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3expectTb4b4b4(Te6edf3pageTb4b4b4.Te6edf3getByTextTb4b4b4(Ta5d6ff"Conversations"Tb4b4b4, Tb4b4b4{ Te6edf3exactTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4)Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeVisibleTb4b4b4(Tb4b4b4{ Te6edf3timeoutTff7b72: T79c0ff25000 Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3page
Tb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff".conversation-item"Tb4b4b4)
Tb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4{ Te6edf3hasTextTff7b72: Ta5d6ff/E2E scroll seed/ Tb4b4b4}Tb4b4b4)
Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3clickTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3waitForMessagesViewportReadyTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3expectTb4b4b4(Te6edf3pageTb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff"#messages"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeVisibleTb4b4b4(Tb4b4b4{ Te6edf3timeoutTff7b72: T79c0ff25000 Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3waitForMessagesOverflowTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3pageTb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff"#messages"Tb4b4b4)Tb4b4b4.Te6edf3evaluateTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3el Tff7b72= Tffa657documentTb4b4b4.Te6edf3getElementByIdTb4b4b4(Ta5d6ff"messages"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3elTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3max Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3elTb4b4b4.Te6edf3scrollHeight Tff7b72- Te6edf3elTb4b4b4.Te6edf3clientHeightTb4b4b4)Tb4b4b4;
Te6edf3elTb4b4b4.Te6edf3scrollTop Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3max Tff7b72- T79c0ff200Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3pageTb4b4b4.Te6edf3waitForTimeoutTb4b4b4(T79c0ff300Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3before Tff7b72= Tff7b72await Te6edf3scrollMetricsTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72await Te6edf3messagesNearBottomTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3pageTb4b4b4.Te6edf3evaluateTb4b4b4(
Tb4b4b4(Tb4b4b4{ Te6edf3peerHashTb4b4b4, Te6edf3localHashTff7b72: Te6edf3lh Tb4b4b4}Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3buf Tff7b72= Tff7b72new Tffa657Uint8ArrayTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3cryptoTb4b4b4.Te6edf3getRandomValuesTb4b4b4(Te6edf3bufTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3hash Tff7b72= Tffa657ArrayTb4b4b4.Tff7b72fromTb4b4b4(Te6edf3bufTb4b4b4, Tb4b4b4(Te6edf3bTb4b4b4) Tb4b4b4=> Te6edf3bTb4b4b4.Te6edf3toStringTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4.Te6edf3padStartTb4b4b4(T79c0ff2Tb4b4b4, Ta5d6ff"0"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72importTb4b4b4(Ta5d6ff"/js/WebSocketConnection.js"Tb4b4b4)Tb4b4b4.Te6edf3thenTb4b4b4(Tb4b4b4(Te6edf3modTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3modTb4b4b4.Tff7b72defaultTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"message"Tb4b4b4, Tb4b4b4{
Te6edf3dataTff7b72: Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"lxmf.delivery"Tb4b4b4,
Te6edf3lxmf_messageTff7b72: Tb4b4b4{
Te6edf3hashTb4b4b4,
Te6edf3source_hashTff7b72: Te6edf3peerHashTb4b4b4,
Te6edf3destination_hashTff7b72: Te6edf3lhTb4b4b4,
Te6edf3contentTff7b72: Ta5d6ff"E2E synthetic inbound (scroll up)"Tb4b4b4,
Te6edf3timestampTff7b72: Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1000Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3peerHashTff7b72: Te6edf3E2E_SCROLL_PEER_HASHTb4b4b4, Te6edf3localHash Tb4b4b4}
Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3pageTb4b4b4.Te6edf3waitForTimeoutTb4b4b4(T79c0ff500Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72await Te6edf3messagesNearBottomTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3testTb4b4b4(Ta5d6ff"stays pinned to bottom when new inbound arrives while at bottom"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4{ Te6edf3pageTb4b4b4, Te6edf3request Tb4b4b4}Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3localHash Tff7b72= Tff7b72await Te6edf3getE2eLocalLxmfHashTb4b4b4(Te6edf3requestTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3pageTb4b4b4.Tff7b72gotoTb4b4b4(Ta5d6ff"/#/messages"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3expectTb4b4b4(Te6edf3pageTb4b4b4.Te6edf3getByTextTb4b4b4(Ta5d6ff"Conversations"Tb4b4b4, Tb4b4b4{ Te6edf3exactTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4)Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeVisibleTb4b4b4(Tb4b4b4{ Te6edf3timeoutTff7b72: T79c0ff25000 Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3page
Tb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff".conversation-item"Tb4b4b4)
Tb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4{ Te6edf3hasTextTff7b72: Ta5d6ff/E2E scroll seed/ Tb4b4b4}Tb4b4b4)
Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3clickTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3waitForMessagesViewportReadyTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3expectTb4b4b4(Te6edf3pageTb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff"#messages"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeVisibleTb4b4b4(Tb4b4b4{ Te6edf3timeoutTff7b72: T79c0ff25000 Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3waitForMessagesOverflowTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3setMessagesToBottomTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3pageTb4b4b4.Te6edf3waitForTimeoutTb4b4b4(T79c0ff200Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72await Te6edf3messagesNearBottomTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3pageTb4b4b4.Te6edf3evaluateTb4b4b4(
Tb4b4b4(Tb4b4b4{ Te6edf3peerHashTb4b4b4, Te6edf3localHashTff7b72: Te6edf3lh Tb4b4b4}Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3buf Tff7b72= Tff7b72new Tffa657Uint8ArrayTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3cryptoTb4b4b4.Te6edf3getRandomValuesTb4b4b4(Te6edf3bufTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3hash Tff7b72= Tffa657ArrayTb4b4b4.Tff7b72fromTb4b4b4(Te6edf3bufTb4b4b4, Tb4b4b4(Te6edf3bTb4b4b4) Tb4b4b4=> Te6edf3bTb4b4b4.Te6edf3toStringTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4.Te6edf3padStartTb4b4b4(T79c0ff2Tb4b4b4, Ta5d6ff"0"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72importTb4b4b4(Ta5d6ff"/js/WebSocketConnection.js"Tb4b4b4)Tb4b4b4.Te6edf3thenTb4b4b4(Tb4b4b4(Te6edf3modTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3modTb4b4b4.Tff7b72defaultTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"message"Tb4b4b4, Tb4b4b4{
Te6edf3dataTff7b72: Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"lxmf.delivery"Tb4b4b4,
Te6edf3lxmf_messageTff7b72: Tb4b4b4{
Te6edf3hashTb4b4b4,
Te6edf3source_hashTff7b72: Te6edf3peerHashTb4b4b4,
Te6edf3destination_hashTff7b72: Te6edf3lhTb4b4b4,
Te6edf3contentTff7b72: Ta5d6ff"E2E synthetic inbound (at bottom)"Tb4b4b4,
Te6edf3timestampTff7b72: Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1000Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3peerHashTff7b72: Te6edf3E2E_SCROLL_PEER_HASHTb4b4b4, Te6edf3localHash Tb4b4b4}
Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3pageTb4b4b4.Te6edf3waitForTimeoutTb4b4b4(T79c0ff600Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72await Te6edf3messagesNearBottomTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3testTb4b4b4(Ta5d6ff"stays near bottom when switching between long and short threads repeatedly"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4{ Te6edf3page Tb4b4b4}Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72await Te6edf3pageTb4b4b4.Tff7b72gotoTb4b4b4(Ta5d6ff"/#/messages"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3expectTb4b4b4(Te6edf3pageTb4b4b4.Te6edf3getByTextTb4b4b4(Ta5d6ff"Conversations"Tb4b4b4, Tb4b4b4{ Te6edf3exactTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4)Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeVisibleTb4b4b4(Tb4b4b4{ Te6edf3timeoutTff7b72: T79c0ff25000 Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3longRow Tff7b72= Te6edf3page
Tb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff".conversation-item"Tb4b4b4)
Tb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4{ Te6edf3hasTextTff7b72: Ta5d6ff/E2E scroll seed/ Tb4b4b4}Tb4b4b4)
Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3shortRow Tff7b72= Te6edf3page
Tb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff".conversation-item"Tb4b4b4)
Tb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4{ Te6edf3hasTextTff7b72: Ta5d6ff/E2E alt short/ Tb4b4b4}Tb4b4b4)
Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff5Tb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72await Te6edf3longRowTb4b4b4.Te6edf3clickTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3waitForMessagesViewportReadyTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3expectTb4b4b4(Te6edf3pageTb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff"#messages"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeVisibleTb4b4b4(Tb4b4b4{ Te6edf3timeoutTff7b72: T79c0ff25000 Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3waitForMessagesOverflowTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72await Te6edf3messagesNearBottomTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3shortRowTb4b4b4.Te6edf3clickTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3waitForMessagesViewportReadyTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3expectTb4b4b4(Te6edf3pageTb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff"#messages"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeVisibleTb4b4b4(Tb4b4b4{ Te6edf3timeoutTff7b72: T79c0ff25000 Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72await Te6edf3messagesNearBottomTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3testTb4b4b4(Ta5d6ff"preserves scroll anchor when loading older messages from the top"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4{ Te6edf3page Tb4b4b4}Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72await Te6edf3pageTb4b4b4.Tff7b72gotoTb4b4b4(Ta5d6ff"/#/messages"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3expectTb4b4b4(Te6edf3pageTb4b4b4.Te6edf3getByTextTb4b4b4(Ta5d6ff"Conversations"Tb4b4b4, Tb4b4b4{ Te6edf3exactTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4)Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeVisibleTb4b4b4(Tb4b4b4{ Te6edf3timeoutTff7b72: T79c0ff25000 Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3page
Tb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff".conversation-item"Tb4b4b4)
Tb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4{ Te6edf3hasTextTff7b72: Ta5d6ff/E2E scroll seed/ Tb4b4b4}Tb4b4b4)
Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3clickTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3waitForMessagesViewportReadyTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3expectTb4b4b4(Te6edf3pageTb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff"#messages"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeVisibleTb4b4b4(Tb4b4b4{ Te6edf3timeoutTff7b72: T79c0ff25000 Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3waitForMessagesOverflowTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3initial Tff7b72= Tff7b72await Te6edf3scrollMetricsTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3initialTb4b4b4.Te6edf3scrollHeightTb4b4b4)Tb4b4b4.Te6edf3toBeGreaterThanTb4b4b4(Te6edf3initialTb4b4b4.Te6edf3clientHeight Tff7b72+ T79c0ff80Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3pageTb4b4b4.Te6edf3locatorTb4b4b4(Ta5d6ff"#messages"Tb4b4b4)Tb4b4b4.Te6edf3hoverTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff60Tb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72await Te6edf3pageTb4b4b4.Te6edf3mouseTb4b4b4.Te6edf3wheelTb4b4b4(T79c0ff0Tb4b4b4, Tff7b72-T79c0ff500Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72await Te6edf3pageTb4b4b4.Te6edf3waitForTimeoutTb4b4b4(T79c0ff2500Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3loaded Tff7b72= Tff7b72await Te6edf3scrollMetricsTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3loadedTb4b4b4.Te6edf3scrollHeight Tff7b72> Te6edf3initialTb4b4b4.Te6edf3scrollHeightTb4b4b4) Tb4b4b4{
Te6edf3expectTb4b4b4(Tff7b72await Te6edf3messagesDistanceFromBottomTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeGreaterThanTb4b4b4(T79c0ff8Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────